VBA集合和字典都支持KEY/ITEM键值对式的存储方式,但:

1、集合的KEY不是必须的,可有,也可以没有。而字典,KEY必须有。

2、集合支持按序号访问,也支持按键访问两种访问模式。字典只支持按KEY访问。

3、集合的序列性比字典强,集合可以在中间插入一个项,而字典则不支持这个功能。

4、集合的添加方式是:值,键(可选),字典的添加方式是:键(必选),值

5、字典支持检查存在性和移除所有项,集合不支持这个功能(只能通过循环法来做,效率差)

6、集合里的内容是排序好了的,字典里的内容是散开的,无序。

7、集合的项一定有序号,字典则没有。字典的项一定有KEY,集合的项不一定有KEY。

8、集合里访问不存在的项,会报错。字典访问不存在的项则不会报错,而是返回空值,所以需要先检查存在性。集合不需要检查存在性,而是通过错误处理来处理存在性。

集合是用户定制的一组数据信息,存放于一个一维数组中,以便用户随时访问、增添、删除同类信息。

这个集合的定义,完全是由用户做主,对集合中的数据类型,没有任何限制……

完全取决于用户是否愿意根据某些自己确定的规则把符合要求的信息内容加入集合。

即,集合中元素可以是各种类型的数值、或文本,或单元格区域,或图片……

集合与一维数组

刚才说集合是一个一维数组,那么为啥不直接让用户自建一个一维数组来存储信息,而要开发集合对象方法这样一个东东呢?

因为集合方法中的一维数组有以下特点,可以简化处理过程,节省用户写代码的时间,也不容易错。

特点1

可以进行写入(.Add添加)、读取、删去(.Remove)操作,

其中.Add添加时,不需要地址,总是自动添加到集合数组中的最后一个位置。

如果是自定义数组,也可以做到,但可能会是这样子:

Sub test2()
Dim arr()
For i=1 To 10
	ReDim Preserve arr(1 To i)'每次在需要向一维数组中添加新元素时,需要先扩大数组
	arr(i)=i'然后再添加新元素
Next
End Sub

虽然实际上集合方法中也是这么做的,但毕竟通过封装和后台运行,减少了用户的麻烦。

接下来,读取集合中元素时,需要指定位置,这个和普通数组并无差异(只有字典可以直接用关键词key定位置)

然后,【比普通数组强】的地方终于出现了!

那就是: 直接删去/抹去已经不需要的某个特定位置的信息!

方法是Remove:

s.Remove (i),如:

s.Remove (1)

s.Remove (s.Count)

删去一维数组中第 i 个信息,同时自动把数组大小缩减

对应的普通数组做法就会比较复杂:

Sub test3()
    ReDim arr(1 To 10)
    For i = 1 To 10
        arr(i) = i
    Next
    Rmv arr, 3
End Sub
Sub Rmv(arr, j)
    For i = j + 1 To UBound(arr)
        arr(i - 1) = arr(i)
    Next
    ReDim Preserve arr(1 To UBound(arr) - 1)
End Sub

也许集合方法中也是这么做的……但毕竟封装、后台运行以后,用户就省心多了。

字典方法有RemoveAll方法可以一下子全部删去,而集合中只能一个一个来:

每次删去第一个的方法,

For i = 1 To s.Count
    s.Remove (1)
Next
或者每次删去最后一个的方法:
For i = 1 To s.Count
    s.Remove (s.Count)
Next

显然第一种方法,每次删去第一的做法更不容易错,也更简单

不过说到最后,一次性删去全部信息还是有绝招的……

Set s = Nothing

这样就彻底清空了。

还有一个做法就是:

Set s = New Collection

这样也可以的。

总结:

删去全部集合元素的方法有三种。

I 重新初始化集合s

Set s = New Collection

处理结果,s为一个已经初始化了的没有任何元素的空集合变量

II 变量s初始化

Set s = Nothing

处理结果,s为一个变量类型为集合对象的空集合变量

其实1和2的执行效果是一样的,只是过程不一样。

III 遍历集合逐个删除(每次删第1个,或删最后1个)

和普通数组相比较,集合的特点:

1. 通常只在末尾添加元素 (添加时不用考虑定义数组的大小,即集合中数组大小是自适应的)

(也可以像插入工作表那样,在某个指定位置之前或之后插入,但意义似乎不大)

2. 不能改变已添加元素的内容

3. 可以任意删除指定位置(指定顺序位置/或指定key值)的元素

4. 不管如何添加和删除,集合中元素始终保持添加时的先后顺序不变


另外,集合和字典方法比较:

1. 集合中可以反复添加相同内容的信息(按顺序作为新元素添加)

而字典的关键词是不可以重复的。(也可以说,是相当于以序号为关键词建立了字典)

2. 集合中元素可以Write in , 但不可以Rewrite

(字典中key不可以改动,但Item可以任意改哦)

集合中关键词key的使用:

1. 必须是文本型字符串值。如果是数值必须用Cstr()函数进行转换。

2. key不能重复(这个和字典一样)

3. key结果不能反输出。(item可以按key或者按Index顺序输出返回值)

集合元素添加的同时,加入关键词的语法:

s.Add Itme, key

……

检索 不存在的key值时会出错……没有字典用法中 d.Exists 方法来容错。

集合本质上是一个数组,但是是一个可以随时插入、删除某个序号位置元素的“灵活”数组。

这个功能显然比一般的一维数组更有意思。

并且,集合也可以使用字典key来关联、定位。所以功能更强大一些。